#include<stdio.h>
#include<Windows.h>
#include<math.h>

typedef struct Student									    //定义一个学生的结构体变量
{
	int num;
	char name[20],string;
	double score[3];

} Stu;

int i, j; 											    //定义全局变量
double average(double score[3]);							//声明自定义函数
void continued(void);
void print(Stu person[], int n);
void selected(Stu person[]);
void insert(Stu person[], Stu person_s[]);

int main()
{
	Stu group[5];											//声明结构体变量

	for (i = 0; i < 5; i++)								//输入数据
	{
		printf_s("\n请输入第%d位学生的学号：", i + 1);
		scanf_s("%d", &group[i].num);
		printf_s("\t\t姓名：");
		scanf_s("%s", group[i].name, 20);
		for (j = 0; j < 3;j++)
		{
			printf_s("\n\t\t第%d门课成绩：\t", j + 1);
			scanf_s("%lf", &group[i].score[j]);
		}
	}
	print(group,5);
	
	//-----1-----//										//将以上数据输出到stud.txt中去
	FILE * fp;
	errno_t err;											//一种数据类型，错误号码，0表示无错误，1表示有

	//fp = fopen_s("stud", "w");							//C89(ANSI C)标准已不适用
	err = fopen_s(&fp, "stud.txt", "w");
	if (err != 0)											//判断文件能否正常打开
	{
		printf_s("\nSorry,we can't open the file.\n");
		exit(0);
	}

	for (i = 0; i < 5; i++)								//输出数据到fp指向的文件
	{
		fprintf_s(fp,"\n第%d位学生的学号：%d", i + 1, group[i].num);
		fprintf_s(fp,"\t姓名：%s\n", group[i].name);
		for (j = 0; j < 3; j++)
		{
			fprintf_s(fp,"\t\t第%d门课成绩：%5.2f\n", j+1, group[i].score[j]);
		}
		fprintf_s(fp,"\t\t第%d位学生的平均成绩为：%5.2f\n", i+1, average(group[i].score));
	}
	putchar(10);
	fclose(fp);											//一定要记得关闭文件

	//-------2---------//									//排序并输出到stu_sort.txt中去
	printf_s("\n开始按平均分从大到小排序\t");
	continued();
	selected(group);
	print(group,5);
	
	err = fopen_s(&fp, "stu_sort.txt", "w");
	if (err != 0)											//判断文件能否正常打开
	{
		printf_s("\nSorry,we can't open the file.\n");
		exit(0);
	}

	for (i = 0; i < 5; i++)								//输出数据到fp指向的文件
	{
		fprintf_s(fp, "\n第%d位学生的学号：%d", i + 1, group[i].num);
		fprintf_s(fp, "\t姓名：%s\n", group[i].name);
		for (j = 0; j < 3; j++)
		{
			fprintf_s(fp, "\t\t第%d门课成绩：%5.2f\n", j + 1, group[i].score[j]);
		}
		fprintf_s(fp, "\t\t第%d位学生的平均成绩为：%5.2f\n", i + 1, average(group[i].score));
	}
	printf_s("\n|成功写入stu_sort.txt !!!|\n");
	putchar(10);
	fclose(fp);											//一定要记得关闭文件
	
	//-------3--------//									//按平均分插入一个学生
	printf_s("\n请再输入一名学生进行插入处理\t");

	continued();
	Stu group_s[6];
	
	insert(group,group_s);
	print(group_s,6);

	printf_s("\n建立一个新文件new.txt\t");
	continued();
	fopen_s(&fp,"new.txt","w");
	fclose(fp);
	printf_s("\n已创建new.txt\n");
	                                                     //建立一个新文件new.txt\\
														//-----------------------\\
													    //|神奇的是，可以用这个代| \\
	//-------4--------//								   // |码来创建.ext类的文件名|  \\
	                                                         //—|和 git 一样           |—-\\
													 //-------------------------------\\
	不知道为什么，用//\\可以将下一行注释掉……^_^
	
	printf_s("\n将插入后的数据添加到stu_sort.txt中去\t");
	continued();

	fopen_s(&fp, "stu_sort.txt", "a");
	fprintf_s(fp, "\n\n\t追加插入后的新数据！！！更新！！！\n\n", i + 1, group_s[i].num);
	for (i = 0; i < 6; i++)								//输出数据到fp指向的文件
	{
		fprintf_s(fp, "\n第%d位学生的学号：%d", i + 1, group_s[i].num);
		fprintf_s(fp, "\t姓名：%s\n", group_s[i].name);
		for (j = 0; j < 3; j++)
		{
			fprintf_s(fp, "\t\t第%d门课成绩：%5.2f\n", j + 1, group_s[i].score[j]);
		}
		fprintf_s(fp, "\t\t第%d位学生的平均成绩为：%5.2f\n", i + 1, average(group_s[i].score));
	}
	putchar(10);
	fclose(fp);
	printf_s("\n添加成功！\n");

	system("pause");
	return 0;
}

double average(double score[3])								//计算平均分
{
	return (score[0] + score[1] + score[2]) / 3;
}

void print(Stu person[], int n)								//按顺序输出数据
{
	for (i = 0; i < n; i++)
	{
		printf_s("\n第%d位学生的学号：%d", i + 1, person[i].num);
		printf_s("\t姓名：%s\n", person[i].name);
		for (j = 0; j < 3; j++)
		{
			printf_s("\t\t第%d门课成绩：%5.2f\n", j + 1, person[i].score[j]);
		}
		printf_s("\t\t第%d位学生的平均成绩为：%5.2f\n", i + 1, average(person[i].score));
	}
}

void continued(void)
{
	fflush(stdin);
	printf_s("按回车执行……");
	getchar();
}

void selected(Stu person[])									//按平均分从大到小排序
{
	Stu temp;
	for (i = 0; i < 4; i++)
	{
		for (j = i + 1; j < 5; j++)
		{
			if (average(person[i].score)<average(person[j].score))
			{
				temp = person[i];
				person[i] = person[j];
				person[j] = temp;

			}
		}
		
	}
	
}

void insert(Stu person[],Stu person_s[])
{
	boolean time = 1;

	printf_s("\n请输入第6位学生的学号：");			//输入第六名学生信息
	scanf_s("%d", &person_s[5].num);
	printf_s("\t\t姓名：");
	scanf_s("%s", person_s[5].name, 20);
	for (j = 0; j < 3; j++)
	{
		printf_s("\n\t\t第%d门课成绩：\t", j + 1);
		scanf_s("%lf", &person_s[5].score[j]);
	}

	printf_s("\n开始插入处理：\n");
	for (i = 0, j = 0; i < 6; i++, j++)
	{
		if (average(person[j].score) <= average(person_s[5].score) && (time == 1))
		{
			person_s[i] = person_s[5];
			j--;
			time = 0;
		}
		else
		{
			person_s[i] = person[j];
		}
	}
}